//
//  ErrorTableViewController.h
//  objective_c_language
//
//  Created by 王玉龙 on 2018/6/7.
//  Copyright © 2018年 longlong. All rights reserved.
//

#import <UIKit/UIKit.h>

FOUNDATION_EXPORT NSErrorDomain const NSCustomErrorDomain;

@interface ErrorTableViewController : UITableViewController

@end

/*NSError 对错误信息进行封装
 由一个 error domain，domain 内的一个 code 和包含应用自定义信息的 userInfo组成。
 使用NSError对象，除了封装多种错误信息，还可以归档保存，以及继承后实现自定义行为。
 
 一、domain 属性 ：指明 error 对象代表的错误具体是发生在哪一层框架
    除了指明层级的 domain，一个框架或某一模块的类都可以提供自己相关错误的 domain 用于分类，当然也包括自己实现的框架和类
 二、code NSInteger类型的 code 说明了 domain 下错误的具体原因。
 
 三、userInfo
 通过 error 对象的 userInfo 字典，可以包含一些其他的自定义信息。
 NSError类内置了几个关于本地化描述错误的 key，除了根据 key 从 userInfo 中取值外，NSError还提供了对应的只读属性来直接读取相关信息。当
 创建 error 对象时，应该在 userInfo 内也提供这几项内容。
 
 四、description
 通过属性localizedDescription获取 key 为NSLocalizedDescriptionKey中的内容，该项是错误的描述，可能包含 failure reason。
 
 五、failure reason
 通过属性localizedFailureReason获取 key 为NSLocalizedFailureReasonErrorKey中的内容，该项是错误原因的解释。
 
 六、recovery suggestion
 通过属性localizedRecoverySuggestion获取 key 为
 NSLocalizedRecoverySuggestionErrorKey中的内容，该项描述了用户如何操作以修复错误。
 
 七、recovery options
 通过属性localizedRecoveryOptions获取 key 为
 NSLocalizedRecoveryOptionsErrorKey中的内容，该项是一个字符串数组，内容是提供给用户操作的按钮的标题，与 recovery suggestion 配合使用，默认的顺序规则是，第一个字符串应该用于最右边的按钮，以此类推。
 
 八、recoveryAttempter （macOS 系统）
 获取 userInfo 中 key 为NSRecoveryAttempterErrorKey的值，该值是一个实现了NSErrorRecoveryAttempting协议的实例，与 recovery options 配合使用，可以让系统根据用户选择点击的按钮，执行相应的修复方法，但只能在 Cocoa 框架中使用

 九、helpAnchor
 获取 userInfo 中 key 为NSHelpAnchorErrorKey的值，用于 Cocoa 框架中，(mas OS 系统)
 NSAlert类执行方法+ alertWithError:时，展示的错误提示框中 help anchor button 的标题。
 */

/*
 Foundation 框架主要声明了以下 4 种主要的错误域
 typedef NSString *NSErrorDomain;
 
 NSCocoaErrorDomain//Cocoa Frameworks（其中包括 Foundation 框架和其它 Objective-C 框架）的错误编码
 NSPOSIXErrorDomain //源自遵守 POSIX 标准的 Unix 的错误编码
 NSOSStatusErrorDomain //Apple OS Core Services 和 Carbon framework 的错误编码
 NSMachErrorDomain //OS 内核错误编码
 
 */
/*
 NSerror 标准用户信息字典键
 typedef NSString *NSErrorUserInfoKey;
 
 
 NSUnderlyingErrorKey//从底层调用嵌入NSErrors的推荐标准方法。这个键的值应该是一个NSError
 
 NSLocalizedDescriptionKey
 
 NSLocalizedFailureReasonErrorKey
 
 NSLocalizedRecoverySuggestionErrorKey
 
 NSLocalizedRecoveryOptionsErrorKey
 
 NSRecoveryAttempterErrorKey
 
 NSHelpAnchorErrorKey
 
 NSDebugDescriptionErrorKey
 
 NSLocalizedFailureErrorKey
 
 NSStringEncodingErrorKey
 
 NSURLErrorKey
 
 NSFilePathErrorKey
 
 https://www.jianshu.com/p/3c0c4ffaaa7d
 */
